// | 联合类型 或 交集 取其一
// & 交叉类型 和 并集 取两者

import { type } from "os";
import { isGeneratorFunction } from "util/types"

// never 永远达不到
// unknown 安全的
// any 任意类型

function test(): never {
    throw new Error()
}

// typeof 类型的收窄
function padLeft(padding: string | number, input: string) {
    if (typeof padding === 'number') {
        return new Array(padding + 1).join(' ') + input
    }
    return padding + input
}

// 真值收窄 通过布尔的方式，实现类型的收窄
function printAll(str: string | string[] | null) {
    if (str && typeof str === 'object') {
        for (var i of str) {
            console.log(i);

        }
    }
}

// 等值收窄
function example(x: string | number, y: string | boolean) {
    if (x === y) {
        x.indexOf(y)
    } else {
        console.log(x);
    }
}
// in操作类型收窄
type Fish = { swim: () => viod }
type Bird = { fly: () => viod }
function move(animal: Fish | Bird) {
    if ('swim' in animal) {
        return animal.swim()
    }
    return animal.fly()
}
// instanceof类型收窄
function test1(x: date | string) {
    if (x instanceof Date) {
        console.log(x.getDay());
    }
}

// 赋值收窄
let x = Math.random() < .5 ? 10 : 'hello'
x = 1;
console.log(x);
x = 'goodbye'
console.log(x);




